home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 20 / 5 / DISK2058.ZIP / UNFAST.EXE / WT.F < prev    next >
Text File  |  1980-01-01  |  41KB  |  2,005 lines

  1. ;
  2. ;The word processor written entirely in FAST.
  3. ;Developed by Peter Campbell, from 24/9/1987 to ...
  4. ;
  5.  
  6. #protect
  7. #errors off
  8. #window memory 4000
  9. #include extinput.fi
  10. #include fsort.fi
  11. #inpend=0
  12. ext_inpend=0
  13.  
  14. ;Screen size !! Change this if setting say EGA 43 lines, probably still bugged.
  15. ;** This will not work yet! FAST must be modified to handle variable width.
  16. const width=80,depth=25,lineb=160,width1=width-1   ;lineb=bytes per line.
  17.  
  18. const xcompilers=4,dl=68,name_len=40
  19. const cfglen=10+51*xcompilers
  20. unsigned md,end_address,current_address,line_address,addl
  21. unsigned block_start,block_end,editm,chkb
  22. var current_column,xpos,ypos,insert,edit_line
  23. var fseg,buffers,current_buffer,backups,last_ypos
  24. var line_print,form_feed,edit_file,line_block,origin_blocka,origin_blockx
  25. var column_block,stab
  26.  
  27. compile_line ? 128
  28. info         ? 16*dl
  29. name_bak     ? name_len+6
  30. buffer         ? 260
  31. sbuffer      ? 260
  32. ebuffer      ? 260
  33. block_type   ? 2
  34. config         ? cfglen
  35. work         ? 100
  36.  
  37. goto skip_undef
  38.  
  39. seperators:
  40. datab ' !^*()-=+\|.,<>/?''":;[]'
  41. sept_end:
  42. const septs=sept_end-seperators
  43.  
  44. skip_undef:
  45.  
  46. proc print_to(ptm,ptn)
  47.     {
  48.     pokeb ptm,(ptn/10)+'0'
  49.     pokeb ptm+1,(ptn mod 10)+'0'
  50.     }
  51.  
  52. proc write_log(wlf)
  53.     {
  54.     open #10,logfile
  55.     if error then
  56.     {
  57.     if error<>2 then return
  58.     create #10,logfile
  59.     write #10,185 from logtop
  60.     }
  61.     else
  62.     {
  63.     var32 wls
  64.     reg bx=handle #10,cx=-1,dx=-1:dos 42(2)
  65.     n=read #10,1 to work:if peekb work=26
  66.         then reg bx=handle #10,cx=-1,dx=-1:dos 42(2)
  67.     }
  68.  
  69.     fill 16 from logline with 2020h
  70.     m=wlf:n=logline
  71.     while peekb m pokeb n,ucase peekb m:m++:n++
  72.     dos 2a
  73.     rday=low reg dx
  74.     rmonth=high reg dx
  75.     ryear=reg cx-1900
  76.     print_to(logline+34,rday)
  77.     print_to(logline+37,rmonth)
  78.     print_to(logline+40,ryear)
  79.     dos 2c
  80.     rhour=high reg cx
  81.     rminute=low reg cx
  82.     print_to(logline+44,rhour)
  83.     print_to(logline+47,rminute)
  84.  
  85.     write #10,51 from logline
  86.     close #10
  87.     }
  88.  
  89. proc bottoms
  90.     {
  91.     colour 7:locate depth-1,0:print
  92.     repeat width print chr 196;
  93.     print:colour 15:cursor depth-1,33
  94.     }
  95.  
  96. procedure abort
  97.     {
  98.     bottoms
  99.     print bios "<WT finished>"
  100.     terminate
  101.     }
  102.  
  103. proc input_message
  104.     {
  105.     open window input_window
  106.     colour 120:locate 20,10
  107.     }
  108.  
  109. on error
  110.     {
  111.     en=error
  112.     if error<1000 then
  113.     {
  114.     bottoms
  115.     error msg "\dos.err"
  116.     print bios "!"
  117.     stop
  118.     }
  119.     open window severe    ;*windows sets error#
  120.     cursor 13,12
  121.     error msg "\wt.err",en
  122.     print bios "!";
  123.     beep
  124.     wait for key=27
  125.     close window
  126.     return
  127.     }
  128.  
  129. proc must_show
  130.     {
  131.     last_address=-1    ;Force new page display.
  132.     last_ypos=-1
  133.     }
  134.  
  135. proc inx  xpos+=current_column:current_column=0
  136.  
  137. function yesno(default)
  138.     {
  139.     forever
  140.     {
  141.     c=ucase key
  142.     if c='Y' then print bios "Y";:return 1
  143.     if c='N' then print bios "N";:return 0
  144.     if c=27  then return 2
  145.     if c=13  then print bios chr 'N'+default*11;:return default
  146.     }
  147.     }
  148.  
  149. proc get_config
  150.     {
  151.     load config_name,config,cfglen
  152.     if error then
  153.     {
  154.     moveb 10 from config_defaults to config
  155.     fillb 51*xcompilers from config+10 with 0
  156.     }
  157.     backups=peekb config
  158.     stab=peekb (config+1)
  159.     split_enter=peekb (config+2)
  160.     comments=peekb (config+6)
  161.     keep_tab=peekb (config+7)
  162.     moveb 3 from config+3 to default_ext+2
  163.     }
  164.  
  165. procedure print_name
  166.     {
  167.     colour 70h
  168.     locate 1,2
  169.     repeat 40 print " ";
  170.     locate 1,2
  171.     nm=name+2     ;Print name of file in ucase case with extension.
  172.     while peekb nm
  173.     {
  174.     pokeb nm,ucase peekb nm
  175.     print chr peekb nm;:nm++
  176.     }
  177.     }
  178.  
  179. function back_line(addl,nlines)
  180.     {
  181.     if nlines then
  182.     {
  183.     repeat nlines
  184.         {
  185.         #short
  186.         if addl=0 then return 0
  187.         addl-=2
  188.         if fseg[addl]b=13 then addl--
  189.         if addl>65520 then return 0
  190.  
  191.         back_loop:
  192.         if addl=0 then return 0
  193.         b=fseg[addl]b
  194.  
  195.         if b<>13 then addl--:goto back_loop
  196.  
  197.         addl+=1+(fseg[addl+1]b=10)
  198.         #long
  199.         }
  200.     }
  201.     return addl
  202.     }
  203.  
  204. function forward_line(addl,nlines)
  205.     {
  206.     if nlines then
  207.     {
  208.     repeat nlines
  209.         {
  210.         na=addl
  211.         addl=searchb 256 from fseg|addl for 13
  212.         if not addl then
  213.         {
  214.         addl=na
  215.         forward_loop:
  216.         #short
  217.         if addl>=end_address then return end_address
  218.         if fseg[addl]b<>13 then addl++:goto forward_loop
  219.         #long
  220.         }
  221.         addl+=1+(fseg[addl+1]b=10)
  222.         if addl>end_address then return end_address
  223.         }
  224.     }
  225.     return addl
  226.     }
  227.  
  228. function end_of_line
  229.     {
  230.     start=buffer+254
  231.     while start>=buffer
  232.     {
  233.     #short
  234.     if peekb start<>' ' then goto end_found
  235.     #long
  236.     start--
  237.     }
  238.     end_found:
  239.     return 1+start-buffer
  240.     }
  241.  
  242. function compress_buffer
  243.     {
  244.     cb_kt=keep_tab
  245.     est=end_of_line+buffer
  246.     st=buffer
  247.     f=sbuffer
  248.     x=0
  249.     while st<est
  250.     {
  251.     b=peekb st
  252.     if cb_kt and (b=' ') then
  253.         {
  254.         bl=(x and 248)+8
  255.         if (bl-x)=1 then goto spput
  256.         flag=1
  257.         for a=1 to bl-x
  258.           if peekb (st+a-1)<>' ' then goto spput
  259.         next a
  260.         b=9:st+=a-2:x=bl-1
  261.         }
  262.     if (b=''') or (b='"') then cb_kt=0
  263.     spput:
  264.     pokeb f,b:f++
  265.     x++:st++
  266.     }
  267.     poke f,0a0dh
  268.     pokeb f+2,1ah
  269.     return f+2-(sbuffer)
  270.     }
  271.  
  272. proc put_line
  273.     {
  274.     line_dif=0:old_address=editm-300
  275.     if (line_address<>-1) and edit_line then
  276.     {
  277.     line_len=compress_buffer
  278.     next_address=forward_line(line_address,1)
  279.     oldlen=next_address-line_address
  280.  
  281.     if (end_address-oldlen+line_len) above editm then
  282.         {
  283.         error 1002
  284.         return
  285.         }
  286.  
  287.     move (end_address-next_address)/2+1 from fseg|next_address
  288.         to fseg|line_address+line_len
  289.     moveb line_len from sbuffer to fseg|line_address
  290.  
  291.     line_dif=line_len-oldlen
  292.     old_address=line_address
  293.     if line_address<block_end then block_end+=line_dif
  294.     if line_address<origin_blocka then origin_blocka+=line_dif
  295.     if line_address<current_address then current_address+=line_dif
  296.     end_address+=line_dif
  297.     edit_file=1
  298.     edit_line=0
  299.     }
  300.     }
  301.  
  302. procedure put_details
  303.     {
  304.     put_line
  305.     pos=current_buffer*dl+info
  306.  
  307.     pokeb pos,xpos:pokeb pos+1,ypos
  308.     poke pos+2,current_address
  309.     poke pos+4,current_column
  310.     poke pos+6,end_address
  311.     poke pos+8,fseg
  312.     poke pos+10,editm
  313.     pokeb pos+12,edit_file
  314.     moveb 55 from name+2 to pos+13
  315.     }
  316.  
  317. procedure get_details
  318.     {
  319.     pos=current_buffer*dl+info
  320.  
  321.     xpos=peekb pos
  322.     ypos=peekb (pos+1)
  323.     current_address=peek (pos+2)
  324.     current_column=peek (pos+4)
  325.     end_address=peek (pos+6)
  326.     fseg=peek (pos+8)
  327.     editm=peek (pos+10)
  328.     edit_file=peekb (pos+12)
  329.     moveb 55 from pos+13 to name+2
  330.  
  331.     must_show
  332.     line_address=-1
  333.     print_name
  334.     }
  335.  
  336. proc word_default
  337.     {
  338.     pokeb default_menu+1,0
  339.     opt=1
  340.     open window default_menu
  341.     wd_back:
  342.     colour 10110b
  343.     locate 4,58:m=default_ext+2:while peekb m print chr ucase peek m;:m++
  344.     locate 5,55:if backups then print "ON "; else print "OFF";
  345.     locate 6,58:if split_enter then print "ON "; else print "OFF";
  346.     locate 7,58:printb stab;
  347.     locate 8,56:if comments then print "C  "; else print "ASM";
  348.     locate 9,58:if keep_tab then print "YES"; else print "NO ";
  349.     pokeb default_menu+1,7
  350.  
  351.     opt=select default_menu,opt
  352.     if not opt then close window:return
  353.     if opt=1 then
  354.     {
  355.     open window def_input
  356.     locate 10,69:colour 60h
  357.     l=ext_input(default_ext)
  358.     close window
  359.     }
  360.     if opt=2 then backups=not backups
  361.     if opt=3 then split_enter=not split_enter
  362.     if opt=4 then
  363.     {
  364.     open window tab_input
  365.     push stab
  366.     cursor 7,67
  367.     stab=inputb
  368.     if not stab then pop stab else pop x
  369.     if stab>20 then stab=20
  370.     if stab<1 then stab=1
  371.     close window
  372.     }
  373.     if opt=5 then comments=not comments
  374.     if opt=6 then keep_tab=not keep_tab
  375.     if opt=7 then
  376.     {
  377.     pokeb config,backups
  378.     pokeb config+1,stab
  379.     pokeb config+2,split_enter
  380.     pokeb config+6,comments
  381.     pokeb config+7,keep_tab
  382.     moveb 3 from default_ext+2 to config+3
  383.     save config_name,config,cfglen
  384.     if error then error 1001
  385.     }
  386.     goto wd_back
  387.     }
  388.  
  389. proc start_buffer
  390.     {
  391.     xpos=0:ypos=0
  392.     current_address=0:current_column=0
  393.     end_address=searchb 65535 from fseg|0 for 26
  394.  
  395.     editm=65520
  396.     if end_address<40000 then editm=end_address+8000
  397.     modify fseg to (editm/16)+1
  398.  
  399.     edit_file=0:edit_line=0
  400.     must_show:line_address=-1
  401.     put_details:print_name
  402.     line_block=0:column_block=0
  403.     }
  404.  
  405. function first_nonblank
  406.     {
  407.     fbx=0
  408.     while (fbx<255) and (peekb (buffer+fbx)=' ') fbx++
  409.     if fbx=255 then fbx=0
  410.     return fbx
  411.     }
  412.  
  413. procedure set_old
  414.     {
  415.     last_address=current_address
  416.     last_column=current_column
  417.     }
  418.  
  419. proc cline(cy)
  420.     {
  421.     m=cy*lineb+1
  422.     repeat width video[m]b=7:m+=2
  423.     }
  424.  
  425. proc fill_block(x1,y1,x2,y2,fc)
  426.     {
  427.     y1+=2:y2+=2
  428.     if x1<0 then x1=0
  429.     if x2<0 then x2=0
  430.     if x1>width1 then x1=width1
  431.     if x2>width1 then x2=width1
  432.  
  433.     y=2
  434.     while y<y1 cline(y):y++
  435.  
  436.     while y<=y2
  437.     {
  438.     m=y*lineb+1
  439.     x=0
  440.     while x<x1 video[m]b=7:m+=2:x++
  441.     while x<=x2 video[m]b=fc:m+=2:x++
  442.     while x<width video[m]b=7:m+=2:x++
  443.     y++
  444.     }
  445.  
  446.     while y<depth cline(y):y++
  447.     }
  448.  
  449. proc reset_block
  450.     {
  451.     column_block=0
  452.     line_block=0
  453.     fill_block(0,0,width1,depth-3,7)
  454.     }
  455.  
  456. proc mark_columns(mcx)
  457.     {
  458.     put_line
  459.     reset_block
  460.     column_block=1
  461.     origin_blocka=line_address
  462.     origin_blockx=mcx
  463.     }
  464.  
  465. proc draw_block
  466.     {
  467.     newx1=xpos:newy1=ypos
  468.     if line_block then newx1=255
  469.  
  470.     newx2=origin_blockx-current_column
  471.     newy2=0
  472.     sa=current_address
  473.     while (newy2<(depth-2)) and (sa below origin_blocka)
  474.     {
  475.     newy2++
  476.     sa=forward_line(sa,1)
  477.     }
  478.  
  479.     if newx1>newx2 then swap newx1,newx2
  480.     if newy1>newy2 then swap newy1,newy2
  481.  
  482.     fill_block(newx1,newy1,newx2,newy2,120)
  483.     }
  484.  
  485. proc home  current_column=0:xpos=0
  486.  
  487. proc top_of_file  current_address=0:ypos=0:home
  488.  
  489. proc put_char(pchr)
  490.     {
  491.     pcx=current_column+xpos
  492.     if pcx<255 then
  493.     {
  494.     if insert then moveb 255-pcx from pcx+buffer to pcx+1+buffer
  495.     pokeb buffer+pcx,pchr
  496.     xpos++
  497.     edit_line=1
  498.     }
  499.     }
  500.  
  501. function sept(sx)
  502.     {
  503.     sbyte=peekb (buffer+sx)
  504.     return searchb septs from seperators for sbyte
  505.     }
  506.  
  507. function word_left(wx)
  508.     {
  509.     x=wx
  510.     if x then x--
  511.     if sept(x) then
  512.     {
  513.     while x>=0
  514.         {
  515.         if not sept(x) then goto wl2
  516.         x--
  517.         }
  518.     return 0
  519.     }
  520.  
  521.     wl2:
  522.     while x>=0
  523.     {
  524.     if sept(x) then return x+1
  525.     x--
  526.     }
  527.     return 0
  528.     }
  529.  
  530. function word_right(wx)
  531.     {
  532.     x=wx
  533.     while x<256
  534.     {
  535.     if sept(x) then goto wr2
  536.     x++
  537.     }
  538.     goto wr_end
  539.  
  540.     wr2:
  541.     while x<256
  542.     {
  543.     if not sept(x) then return x
  544.     x++
  545.     }
  546.  
  547.     wr_end:
  548.     if x>=end_of_line then return end_of_line
  549.     return wx
  550.     }
  551.  
  552.  
  553. proc del(xd) moveb 255-xd from buffer+xd+1 to buffer+xd:edit_line=1
  554.  
  555. proc back(xd)
  556.     {
  557.     if xd then
  558.     {
  559.     moveb 256-xd from buffer+xd to buffer-1+xd
  560.     xpos--
  561.     }
  562.     edit_line=1
  563.     }
  564.  
  565. proc clear_line fill 130 from buffer with 2020h:home:edit_line=1
  566.  
  567. proc clear_eol
  568.     {
  569.     pcx=current_column+xpos
  570.     fillb 256-pcx from buffer+pcx with 20h
  571.     edit_line=1
  572.     }
  573.  
  574. function make_memory
  575.     {
  576.     fseg=allocate 4096 ;64k
  577.     if error then error 1002:return 0
  578.     else fill 32768 from fseg|0 with 1a1ah  ;All end characters.
  579.     return fseg
  580.     }
  581.  
  582. procedure screen_display
  583.     {
  584.     colour 7:cls:locate 0,0
  585.     fill width from video|0 with 5020h
  586.     colour 50h
  587.     print " WT v2.07 By Peter Campbell.      F1-Help   Files   Compile     Defaults"
  588.     fill width from video|lineb with 7020h
  589.     colour 70h
  590.     locate 1,44:repeat 36 print " ";
  591.     }
  592.  
  593. proc parameters
  594.     {
  595.     colour 70h
  596.     locate 1,54:print "Col=";current_column+xpos+1;"  ";
  597.     locate 1,63:print "Size=";end_address;"    ";
  598.     }
  599.  
  600. function insert_block(s,bseg,e,l)
  601.     {
  602.     put_line
  603.     if (end_address+l) > (editm-300) then error 1003:return 0
  604.  
  605.     move (end_address-s)/2+1 from fseg|s to fseg|s+l
  606.     moveb l from bseg|e to fseg|s
  607.  
  608.     if (s below origin_blocka) or (s=origin_blocka) then origin_blocka+=l
  609.     end_address+=l
  610.     edit_file=1:edit_line=0
  611.     must_show:line_address=-1
  612.     return 1
  613.     }
  614.  
  615. proc split_line(sx,ss)
  616.     {
  617.     fill 128 from ebuffer with 2020h
  618.     moveb 256-sx from buffer+sx to ebuffer+ss
  619.     clear_eol:current_column=0:xpos=end_of_line
  620.  
  621.     push insert
  622.     insert=1
  623.     put_char(13):put_char(10)
  624.     pop insert
  625.  
  626.     put_line
  627.     line_address=forward_line(line_address,1)
  628.     edit_line=1
  629.     move 128 from ebuffer to buffer
  630.  
  631.     must_show
  632.     }
  633.  
  634. proc centre_line
  635.     {
  636.     if ypos>11
  637.     then current_address=forward_line(current_address,ypos-11):ypos=11
  638.     else
  639.     {
  640.     md=back_line(current_address,11-ypos)
  641.     nd=forward_line(md,11-ypos)
  642.     if nd=current_address then current_address=md:ypos=11
  643.     }
  644.     }
  645.  
  646. proc delete_block(ds,de)
  647.     {
  648.     put_line
  649.     if ds above de then swap ds,de
  650.     move (end_address-de)/2+1 from fseg|de to fseg|ds
  651.     if ds below origin_blocka then
  652.     origin_blocka-=de-ds:if carry then reset_block
  653.     if current_address>ds then
  654.     current_address-=de-ds:if carry then current_address=0
  655.     end_address-=de-ds
  656.     fseg[end_address]b=26
  657.     must_show
  658.     line_address=-1:edit_file=1
  659.     }
  660.  
  661. proc delete_line
  662.     {
  663.     put_line
  664.     ea=forward_line(line_address,1)
  665.     delete_block(line_address,ea)
  666.     }
  667.  
  668. function get_column(ea)
  669.     {
  670.     col=0:ga=current_address
  671.     while col<255
  672.     {
  673.     if ga=ea then return col
  674.     byte=fseg[ga]b:ga++
  675.     if (byte=13) or (byte=26) then return col
  676.     if byte=9 then col=(col and 248)+8
  677.     else col++
  678.     }
  679.     wait for key=27
  680.     return 0
  681.     }
  682.  
  683. proc get_line(ga)
  684.     {
  685.     if line_address=ga then return
  686.     put_line
  687.     if ga above old_address then ga+=line_dif
  688.     line_address=ga
  689.  
  690.     fill 130 from buffer with 2020h
  691.     col=0
  692.     edit_line=0
  693.  
  694.     while col<255
  695.     {
  696.     byte=fseg[ga]b:ga++
  697.     if (byte=13) or (byte=26) then return
  698.     if byte=9 then col=(col and 248)+8
  699.     else
  700.         {
  701.         pokeb buffer+col,byte
  702.         col++
  703.         }
  704.     }
  705.     error 1004
  706.     }
  707.  
  708. function scrap(do)
  709.     {
  710.     put_line
  711.     line_address=forward_line(current_address,ypos)
  712.     input_message:print "Saving block...";
  713.  
  714.     if line_block or column_block then
  715.     {
  716.     block_start=origin_blocka
  717.     block_end=line_address
  718.     if block_start>block_end then swap block_start,block_end
  719.     }
  720.     else
  721.     {
  722.     block_start=line_address
  723.     block_end=line_address
  724.     }
  725.     block_end=forward_line(block_end,1)
  726.  
  727. ;#if 1
  728. ;   print " as: ";
  729. ;   ni=ext_input(block_name_i)
  730. ;   create #1,block_name_i+2
  731. ;#endif
  732.     create #1,block_name:if error then error 1005:return
  733.  
  734.     if not column_block then
  735.     {
  736.     write #1,block_end-block_start from fseg|block_start
  737.     if error then close #1:error 1005:return
  738.     if do then
  739.         {
  740.         delete_block(block_start,block_end)
  741.         if block_start<current_address then current_address=block_start
  742.         }
  743.     }
  744.  
  745.     if column_block then
  746.     {
  747.     x1=origin_blockx
  748.     xc=xpos+current_column
  749.     if xc<x1 then swap x1,xc
  750.     scrap_len=1+xc-x1
  751.     pokeb block_type,0:pokeb block_type+1,scrap_len
  752.     write #1,2 from block_type
  753.     if error then close #1:error 1005:return
  754.  
  755.     while block_start<block_end
  756.         {
  757.         get_line(block_start)
  758.         write #1,scrap_len from buffer+x1
  759.         if error then close #1:error 1005:return
  760.         if do then moveb 256-x1-scrap_len
  761.         from buffer+x1+scrap_len to buffer+x1:edit_line=1
  762.         block_start=forward_line(line_address,1)
  763.         }
  764.     put_line
  765.     }
  766.  
  767.     close #1
  768.     if do then must_show:line_address=-1
  769.     close window
  770.     reset_block
  771.     return 1
  772.     }
  773.  
  774. proc read_columns
  775.     {
  776.     inx
  777.     scrap_len=peekb (block_type+1)
  778.     scrap_ca=line_address
  779.     if (scrap_len+xpos)>255 then error 1006:return
  780.  
  781.     forever
  782.     {
  783.     get_line(scrap_ca)
  784.     moveb 256-xpos-scrap_len from xpos+buffer to xpos+scrap_len+buffer
  785.     rlen=read #1,scrap_len to buffer+xpos:if error then return
  786.     if rlen<>scrap_len then return
  787.     edit_line=1
  788.     put_line
  789.     scrap_ca=forward_line(scrap_ca,1)
  790.     }
  791.     }
  792.  
  793. proc join_line(xj)
  794.     {
  795.     x=end_of_line
  796.     if xj<x then xj=x
  797.     ml=forward_line(line_address,1)
  798.     move 128 from buffer to ebuffer
  799.     push line_address
  800.     get_line(ml)
  801.     moveb 256-xj from buffer to ebuffer+xj
  802.     delete_line
  803.     pop line_address
  804.     move 128 from ebuffer to buffer
  805.     edit_line=1
  806.  
  807.     must_show
  808.     }
  809.  
  810. proc shift_left
  811.     {
  812.     current_column=0
  813.     xpos=first_nonblank
  814.     xn=(xpos/stab)*stab-stab
  815.     if xn<0 then xn=0
  816.     if xpos then
  817.     {
  818.     moveb 256-xpos from buffer+xpos to buffer+xn
  819.     edit_line=1
  820.     }
  821.     }
  822.  
  823. proc shift_right
  824.     {
  825.     current_column=0
  826.     xpos=first_nonblank
  827.     xn=((xpos+stab)/stab)*stab
  828.     moveb 256-xn from buffer+xpos to buffer+xn
  829.     fillb xn-xpos from buffer+xpos with ' '
  830.     edit_line=1
  831.     }
  832.  
  833. procedure page_display
  834.     {
  835.     set_old
  836.     colour 7
  837.     md=current_address
  838.  
  839.     for yp=2 to depth-1
  840.     locate yp,0
  841.     col=0
  842.     while col<current_column
  843.     {
  844.     #short
  845.     b=fseg[md]b
  846.     if b=13 then
  847.         {
  848.         fill width from video|locpos with 0720h
  849.         md++:goto page_nl
  850.         }
  851.     if b<>9 then col++ else col=(col and 248)+8
  852.     if md=end_address then goto page_end
  853.     md++
  854.     #long
  855.     }
  856.  
  857.     line_loop:
  858.     md=printm fseg|md,width
  859.     if md=end_address then goto page_end
  860.     ffc=fseg[md-1]b
  861.     if (ffc<>13) and (ffc<>10) then
  862.     {
  863.     md=searchb 256 from fseg|md for 13
  864.     if md=0 then goto page_end
  865.     md++
  866.     if fseg[md]b=10 then md++
  867.     if md>=end_address then goto page_end
  868.     }
  869.  
  870.     page_nl:
  871.     next yp
  872.     return
  873.  
  874.     page_end:
  875.     m=yp*lineb+lineb
  876.     m2=lineb*depth
  877.     if m<m2 then repeat (m2-m)/2 video[m]b=' ':m+=2
  878.     }
  879.  
  880. proc print_buffer  ml=printm buffer+current_column,width,0
  881.  
  882. procedure print_line(py)
  883.     {
  884.     locate 2+py,0
  885.     ma=forward_line(current_address,py)
  886.     get_line(ma)
  887.     last_ypos=py
  888.     print_buffer
  889.     }
  890.  
  891. function get_directory
  892.     {
  893.     dir_seg=allocate 1024:if error then error 1007:return 0
  894.     dir name+2,dir_seg|0:files=dir_seg[0]
  895.     if not files then
  896.     {
  897.     none_dir:
  898.     error 1008
  899.  
  900.     exit_dir:
  901.     deallocate dir_seg
  902.     return 0
  903.     }
  904.  
  905.     if not sort(dir_seg,2,13,files) then goto none_dir
  906.     x=0:lx=-1
  907.     open window direct_window
  908.     colour 10110b
  909.     locate 23,3:print " ";files;" file(s) ";
  910.  
  911.     forever
  912.     {
  913.     if (x/60)<>lx then
  914.         {
  915.         start=(x/60)*60
  916.         lx=x/60
  917.         px=2:py=11
  918.  
  919.         while py<23
  920.         {
  921.         locate py,px:print "        ";:locate py,px
  922.         if start<files then
  923.             {
  924.             st=(start*13)+2
  925.             while dir_seg[st]b print chr dir_seg[st]b;:st++
  926.             start++
  927.             }
  928.         px+=16:if px>75 then px=2:py++
  929.         }
  930.         }
  931.  
  932.     py=(x mod 60)/5:px=x mod 5
  933.     locate py+11,px*16+2:st=locpos+1:old=st
  934.     repeat 12 video[st]b=112:st+=2
  935.  
  936.     wait for keypressed:s=scan
  937.     if s=1 then close window:goto exit_dir
  938.     if s=72 then x-=5
  939.     if s=80 then x+=5
  940.     if s=75 then x--
  941.     if (s=77) or (s=15) then x++
  942.     if s=73 then x-=60
  943.     if s=81 then x+=60
  944.     if (s=71) or (x<0) then x=0
  945.     if (s=79) or (x>=files) then x=files-1
  946.  
  947.     st=old:repeat 12 video[st]b=10110b:st+=2
  948.  
  949.     if s=28 then
  950.         {
  951.         move 7 from dir_seg|x*13+2 to name+2
  952.         close window
  953.         deallocate dir_seg
  954.         return 1
  955.         }
  956.     }
  957.     }
  958.  
  959. function load_buffer(use_command)
  960.     {
  961.     retry_load:
  962.     if buffers=16 then error 1010:return 0
  963.     open window input_load_name
  964.  
  965.     colour 10111b
  966.     locate 13,62:print "[.";
  967.     st=default_ext+2
  968.     while peekb st print chr(ucase peek st);:st++
  969.     print "]";
  970.  
  971.     locate 13,13
  972.     l=1:if not use_command then l=ext_clean_input(name)
  973.     if (peekb (name+2)=0) or (l=0) then close window:return 0
  974.  
  975.     nm=name+2
  976.     while peekb nm<=' ' nm++
  977.     moveb name_len from nm to name+2
  978.  
  979.     nm=name+2:cd=0
  980.     while peekb nm cd+=peekb nm='.':nm++
  981.     if not cd then
  982.     {
  983.     pokeb nm,'.'
  984.     move 2 from default_ext+2 to nm+1
  985.     }
  986.  
  987.     wild=0
  988.     nm=name+2
  989.     while peekb nm
  990.     {
  991.     b=peekb nm
  992.     if (b='*') or (b='?') then wild=1
  993.     nm++
  994.     }
  995.     if wild then if not get_directory then
  996.     {
  997.     close window:use_command=0
  998.     goto retry_load
  999.     }
  1000.  
  1001.     locate 13,13:nm=name+2
  1002.     while peekb nm print chr(ucase peek nm);:nm++
  1003.  
  1004.     fseg=make_memory
  1005.     if not fseg then close window:return 0
  1006.     fseg[65500]b=1ah
  1007.     load name+2,fseg|0,65501
  1008.     if error then
  1009.     {
  1010.     if error<>2 then error 1009:close window:return 0
  1011.     print "  (new file)"
  1012.     repeat 3 repeat 50000 {}
  1013.     }
  1014.     if fseg[65500]b<>1ah then error 1020
  1015.  
  1016.     close window
  1017.     current_buffer=buffers
  1018.     buffers++
  1019.     start_buffer
  1020.     return 1
  1021.     }
  1022.  
  1023. proc display_buffers
  1024.     {
  1025.     pokeb sel_buf+5,buffers+6 ;Only size for the number of buffers.
  1026.     poke sel_buf,1
  1027.     open window sel_buf
  1028.     start=info+13
  1029.     y=6
  1030.     colour 1fh
  1031.     repeat buffers
  1032.     {
  1033.     pos=start
  1034.     locate y,8
  1035.     while peekb pos print chr ucase peek pos;:pos++
  1036.     if peekb (start-1) then print " (save)";
  1037.     y++
  1038.     start+=dl
  1039.     }
  1040.     pokeb sel_buf,1:pokeb sel_buf+1,buffers
  1041.     }
  1042.  
  1043. function select_buffer
  1044.     {
  1045.     display_buffers
  1046.     y=select sel_buf,current_buffer+1
  1047.     close window
  1048.     if not y then get_details:return 0
  1049.     current_buffer=y-1
  1050.     get_details
  1051.     return 1
  1052.     }
  1053.  
  1054. proc set_positions
  1055.     {
  1056.     while xpos<0
  1057.     {
  1058.     xpos+=8
  1059.     current_column-=8
  1060.     if current_column<0 then current_column=0:xpos=0
  1061.     }
  1062.     while xpos>width1
  1063.     {
  1064.     xpos-=8
  1065.     current_column+=8
  1066.     if current_column>176 then current_column=176:xpos=width1
  1067.     }
  1068.     if ypos<0 then ypos=0:current_address=back_line(current_address,1)
  1069.     if ypos>(depth-3) then ypos=depth-3:current_address=forward_line(current_address,1)
  1070.     if current_column<0 then current_column=0
  1071.     if current_column>176 then current_column=176
  1072.     if current_address above end_address then current_address=end_address
  1073.  
  1074.     if (current_address<>last_address) or (ypos<>last_ypos) then
  1075.     {
  1076.     ma=current_address
  1077.     yo=0
  1078.     if ypos then
  1079.         {
  1080.         repeat ypos
  1081.         {
  1082.         oldma=ma
  1083.         ma=forward_line(ma,1)
  1084.         if ma=oldma then ypos=yo:goto get_yo
  1085.         yo++
  1086.         }
  1087.         }
  1088.     get_yo:
  1089.     get_line(ma)
  1090.     last_ypos=ypos
  1091.     }
  1092.  
  1093.     if (current_address<>last_address) or (current_column<>last_column) then
  1094.     {
  1095.     if keypressed then
  1096.         {
  1097.         last_address=-1
  1098.         goto exe_key
  1099.         }
  1100.     colour 7
  1101.     if current_address=last_address then goto page_all
  1102.     md=forward_line(current_address,1)
  1103.     if md=last_address then
  1104.         {
  1105.         scroll down 0,2,width1,depth-1,1
  1106.         print_line(0)
  1107.         goto edit_page
  1108.         }
  1109.     md=back_line(current_address,1)
  1110.     if md=last_address then
  1111.         {
  1112.         scroll 0,2,width1,depth-1,1
  1113.         print_line(depth-3)
  1114.         goto edit_page
  1115.         }
  1116.  
  1117.     page_all:
  1118.     page_display
  1119.  
  1120.     edit_page:
  1121.     set_old
  1122.     }
  1123.  
  1124.     exe_key:
  1125.  
  1126.     if (current_address<>last_address) or (ypos<>last_ypos) then
  1127.     {
  1128.     ma=forward_line(current_address,ypos)
  1129.     get_line(ma)
  1130.     last_ypos=ypos
  1131.     }
  1132.  
  1133.     if column_block or line_block then draw_block
  1134.  
  1135.     locate ypos+2,0
  1136.     print_buffer
  1137.     parameters
  1138.     if mono
  1139.     then cursor size 12-(insert*4),13
  1140.     else cursor size 6-(insert*2),7
  1141.     cursor ypos+2,xpos
  1142.     }
  1143.  
  1144. function finds(fs,fe,findseg)
  1145.     {
  1146.     flen=fe-fs
  1147.     while flen
  1148.     {
  1149.     f=searchb flen from findseg|fs for peekb (findstr+2)
  1150.     if f then
  1151.         {
  1152.         m=findstr+3
  1153.         f2=f:fxadd=f
  1154.         while peekb m
  1155.         {
  1156.         #short
  1157.         c=peekb m:m++:f2++
  1158.         if c='?' then goto fnchar
  1159.         if c<>findseg[f2]b then goto fnext
  1160.         fnchar:
  1161.         #long
  1162.         }
  1163.         if findseg<>reg cs then
  1164.         {
  1165.         if (findseg[f2-1]b<>10) and (findseg[f2-1]b<>13)
  1166.         then current_address=back_line(f2,1)
  1167.         else current_address=f2
  1168.         }
  1169.         return 1
  1170.  
  1171.         fnext:
  1172.         f++
  1173.         flen=fe-f:fs=f
  1174.         if f above fe then return 0
  1175.         }
  1176.     else return 0
  1177.     }
  1178.     return 0
  1179.     }
  1180.  
  1181. function find_string
  1182.     {
  1183.     if finds(buffer+xpos+current_column,buffer+255,reg cs) then
  1184.     {
  1185.     xpos=f-buffer:current_column=0
  1186.     return 1
  1187.     }
  1188.     nl=forward_line(current_address,ypos+1)
  1189.     if finds(nl,end_address,fseg) then
  1190.     {
  1191.     current_column=0:xpos=get_column(fxadd)
  1192.     ypos=0:centre_line
  1193.     return 1
  1194.     }
  1195.     return 0
  1196.     }
  1197.  
  1198. proc input_find(first)
  1199.     {
  1200.     if first then
  1201.     {
  1202.     input_message
  1203.     print "Find: ";
  1204.     findl=ext_input(findstr)
  1205.     c=0:if findl then c=peekb(findstr+2)
  1206.     if c=0 then close window:return 0
  1207.     findl--
  1208.     }
  1209.     else xpos++
  1210.  
  1211.     if find_string then
  1212.     {
  1213.     if first then close window
  1214.     return 1
  1215.     }
  1216.     if first then close window
  1217.  
  1218.     input_message
  1219.     print "Text not found!"
  1220.     wait for keyscan
  1221.     close window
  1222.     if not first then xpos--
  1223.     return 0
  1224.     }
  1225.  
  1226. proc input_replace(first)
  1227.     {
  1228.     ir=input_find(first)
  1229.     if first then
  1230.     {
  1231.     input_message
  1232.     print "Replace: ";
  1233.     replacel=ext_input(replacestr)
  1234.     c=0:if replacel then c=peekb(replacestr+2)
  1235.     close window
  1236.     if c=0 then return 0
  1237.     replacel--
  1238.     }
  1239.  
  1240.     replace_again:
  1241.     if ir then
  1242.     {
  1243.     last_address=-1:set_positions
  1244.     input_message
  1245.     print "Replace Yes/No/All or ESC? ";
  1246.     wait for keypressed:rk=lcase key:print chr rk;
  1247.     replace=0          ;Default: replace none.
  1248.     if rk='y' then replace=1     ;One only.
  1249.     if rk='a' then replace=32767    ;Max.
  1250.     close window
  1251.     if rk=27 then return
  1252.  
  1253.     if replace=0 then xpos++:ir=find_string
  1254.     while (replace<>0) and (ir<>0)
  1255.         {
  1256.         moveb 256-xpos-findl from buffer+xpos+findl to buffer+xpos+replacel
  1257.         moveb replacel from replacestr+2 to buffer+xpos
  1258.         edit_line=1
  1259.         replace--
  1260.         xpos+=replacel:ir=find_string
  1261.         if (replace<>0) and (ir<>0) then set_positions
  1262.         }
  1263.     if replace then last_address=-1:set_positions
  1264.     goto replace_again
  1265.     }
  1266.     }
  1267.  
  1268. proc print_file
  1269.     {
  1270.     input_message:loctocur
  1271.     print bios "Print current Scrap or File? (s/f) ";
  1272.     wait for keypressed
  1273.     pk=lcase key
  1274.     print bios chr pk;" ... ESC aborts.";
  1275.  
  1276.     if pk='s' then
  1277.     {
  1278.     lps=allocate 4096:if error then error 1016:goto end_lprint
  1279.     fill 32768 from lps|0 with 1a1ah
  1280.     load block_name,lps|0
  1281.     if error then error 1005:goto lp_deall
  1282.     if lps[0]b then
  1283.         {
  1284.         m=0
  1285.         while lps[m]b<>1ah
  1286.         {
  1287.         lprint chr lps[m]b;:m++
  1288.         if key=27 then goto lp_deall
  1289.         }
  1290.         }
  1291.     else
  1292.         {
  1293.         scrap_len=lps[1]b
  1294.         m=2:c=scrap_len
  1295.         while lps[m]b<>1ah
  1296.         {
  1297.         lprint chr lps[m]b;
  1298.         m++
  1299.         c--
  1300.         if c=0 then lprint:c=scrap_len
  1301.         }
  1302.         }
  1303.     lp_deall:
  1304.     deallocate lps
  1305.     }
  1306.     else if pk='f' then
  1307.     {
  1308.     m=0
  1309.     while fseg[m]b<>1ah
  1310.         {
  1311.         lprint chr fseg[m];:m++
  1312.         if key=27 then goto end_lprint
  1313.         }
  1314.     }
  1315.  
  1316.     end_lprint:
  1317.     close window
  1318.     }
  1319.  
  1320. proc load_file
  1321.     {
  1322.     x=load_buffer(0)
  1323.     if not x then
  1324.     {
  1325.     if not buffers then abort
  1326.     get_details
  1327.     }
  1328.     }
  1329.  
  1330. proc save_file(new_nameq)
  1331.     {
  1332.     put_line
  1333.     if new_nameq then
  1334.     {
  1335.     input_message
  1336.     print "Save file as: ";
  1337.     l=ext_input(name)
  1338.     close window
  1339.     if not l then return
  1340.     print_name
  1341.     }
  1342.  
  1343.     moveb name_len+6 from name+2 to name_bak
  1344.     f=searchb name_len+6 from name_bak for '.'
  1345.     if not f then f=searchb name_len+6 from name_bak for 0
  1346.     if f then moveb 5 from bak_extension to f
  1347.  
  1348.     if backups then
  1349.     {
  1350.     delete name_bak ;If error then assume doesn't exist.
  1351.     rename name+2 to name_bak:if error>2 then error 1021:return
  1352.     }
  1353.  
  1354.     create #1,name+2:if error then error 1021:return
  1355.     write #1,end_address+1 from fseg|0:if error then close #1:error 1021:return
  1356.     close #1
  1357.  
  1358.     write_log(name+2)
  1359.  
  1360.     edit_file=0:edit_line=0
  1361.     put_details
  1362.     }
  1363.  
  1364. proc save_alter
  1365.     {
  1366.     if edit_file then
  1367.     {
  1368.     open window save_altered_file
  1369.     retry_yesno:
  1370.     cursor 12,51
  1371.     wait_yesno:
  1372.     byte=lcase key
  1373.     if byte=27 then close window:return
  1374.     if (byte<>'y') and (byte<>'n') then goto wait_yesno
  1375.     close window
  1376.     if byte='y' then save_file(0)
  1377.     if byte='n' then edit_file=0
  1378.     }
  1379.    }
  1380.  
  1381. proc exe(ad)
  1382.     {
  1383.     close windows
  1384.     colour 7:cls
  1385.     cursor 0,0
  1386.  
  1387.     poke exe_com+4,reg cs
  1388.     poke exe_com+8,reg cs
  1389.     poke exe_com+12,reg cs
  1390.  
  1391.     m=ad
  1392.     while peekb m print bios chr lcase peek m;:m++
  1393.     m=compile_line+1
  1394.     while peekb m<>13 print bios chr lcase peek m;:m++
  1395.     print bios
  1396.  
  1397.     execute ad,exe_com
  1398.     if error then error 1011
  1399.     }
  1400.  
  1401. proc compile
  1402.     {
  1403.     if edit_file then save_file(0)
  1404.  
  1405.     compile1:
  1406.     pokeb comp_menu+1,0
  1407.     open window comp_menu
  1408.     compile2:
  1409.     start=config+10:colour 60h
  1410.     for y=1 to xcompilers
  1411.     m=start
  1412.     locate y+7,14
  1413.     while peekb m print chr peek m;:m++
  1414.     start+=51
  1415.     next y
  1416.  
  1417.     comp_loop:
  1418.     pokeb comp_menu+1,xcompilers+1
  1419.     co=select comp_menu,2
  1420.     if not co then close window:return
  1421.     if co=1 then
  1422.     {
  1423.     pokeb comp_menu+1,xcompilers
  1424.     pokeb comp_menu+3,5
  1425.     co=select comp_menu,1
  1426.     if co then
  1427.         {
  1428.         locate co+7,14
  1429.         ckm=config+10+(co-1)*51
  1430.         moveb 51 from ckm to comp_input+2
  1431.         l=ext_input(comp_input)
  1432.         if l then moveb 51 from comp_input+2 to ckm
  1433.         x=searchb 50 from ckm for 0
  1434.         if x then fillb 51-(x-ckm) from x with 0
  1435.         }
  1436.     pokeb comp_menu+3,4
  1437.     close window
  1438.     goto compile1
  1439.     }
  1440.  
  1441.     nameslen=(searchb name_len from name+2 for 0)-(name+2)
  1442.     move 25 from config+10+(co-2)*51 to name_bak
  1443.     poke compile_line,0d01h
  1444.     f=searchb 50 from name_bak for ' '
  1445.     if f then
  1446.     {
  1447.     move 25 from f to compile_line+1
  1448.     pokeb f,0
  1449.     f=compile_line+1
  1450.     while peekb f
  1451.         {
  1452.         if peekb f='%' then
  1453.         {
  1454.         moveb compile_line+100-f from f to f+nameslen-1
  1455.         moveb nameslen from name+2 to f
  1456.         f+=nameslen-1
  1457.         }
  1458.         f++
  1459.         }
  1460.     pokeb f,13
  1461.     pokeb compile_line,f-compile_line
  1462.     }
  1463.  
  1464.     exe(name_bak)
  1465.  
  1466.     print bios cr lf
  1467.     cursor 24,0:print bios "Press any key to return to WT";
  1468.     wait for keyscan
  1469.     }
  1470.  
  1471. proc exit_file(flag)
  1472.     {
  1473.     if flag then
  1474.     {
  1475.     if not select_buffer then return
  1476.     save_alter
  1477.     if edit_file then return
  1478.     }
  1479.  
  1480.     parameters
  1481.     deallocate fseg
  1482.  
  1483.     if current_buffer<>(buffers-1) then moveb ((buffers-1)-current_buffer)*dl
  1484.        from info+(1+current_buffer)*dl to current_buffer*dl+info
  1485.  
  1486.     buffers--
  1487.     current_buffer=0
  1488.     get_details
  1489.     if not buffers then load_file
  1490.     }
  1491.  
  1492. proc exit_wordq
  1493.     {
  1494.     eflag=0
  1495.     for file=0 to buffers-1
  1496.     current_buffer=file
  1497.     get_details
  1498.     if edit_file then
  1499.     {
  1500.     if eflag=0 then
  1501.         {
  1502.         eflag=1
  1503.         pokeb wind_files+5,buffers+5
  1504.         open window wind_files:y=4
  1505.         }
  1506.     locate y,2
  1507.     nm=name+2
  1508.     while peekb nm print chr ucase peek nm;:nm++
  1509.     y++
  1510.     }
  1511.     next file
  1512.  
  1513.     while eflag
  1514.     {
  1515.     eflag=0
  1516.     no=0
  1517.     locate y,2
  1518.     print "Save file(s)? y/n ";
  1519.     no_againq:
  1520.     loctocur
  1521.     wait for keypressed
  1522.     r=ucase key
  1523.     if r='N' then
  1524.         {
  1525.         if no then abort
  1526.         no=1:beep:goto no_againq
  1527.         }
  1528.     close window
  1529.     if r<>'Y' then return
  1530.     for file=0 to buffers-1
  1531.     current_buffer=file
  1532.     get_details
  1533.     if edit_file then save_file(0):if edit_file then eflag=1
  1534.     next file
  1535.     }
  1536.  
  1537.     abort
  1538.     }
  1539.  
  1540. proc help_me
  1541.     {
  1542.     must_show
  1543.     #errors off
  1544.     hs=allocate 2048/16:if error then goto help_err
  1545.     load "\wt.hlp",hs|0,2048:if error then goto help_err2
  1546.     #errors on
  1547.  
  1548.     m=0:colour 7
  1549.     for y=2 to depth-1
  1550.     locate y,0
  1551.     m=printm hs|m,width
  1552.     next y
  1553.  
  1554.     wait for keyscan
  1555.     deallocate hs
  1556.     return
  1557.  
  1558.     help_err2:
  1559.     deallocate hs
  1560.     help_err:
  1561.     error 1015
  1562.     }
  1563.  
  1564. proc word_files
  1565.     {
  1566.     word_start:
  1567.     put_details
  1568.     sw=menu files_menu:goto word_files2
  1569.     forever
  1570.     {
  1571.     sw=select files_menu,sw
  1572.     word_files2:
  1573.     if not sw then close window:return
  1574.     if sw=1 then exit_file(1):if not buffers then abort
  1575.     if sw=2 then
  1576.         {
  1577.         poke compile_line,0d01h
  1578.         exe(dos_shell)
  1579.         goto entry
  1580.         }
  1581.     if sw=3 then exit_wordq
  1582.     }
  1583.     }
  1584.  
  1585. ;- main entry ---------------------------------------------------------------
  1586.  
  1587. get_config
  1588. buffers=0
  1589. screen_display
  1590. insert=1
  1591.  
  1592. nm=81h
  1593. while peekb nm<>13
  1594.     {
  1595.     if peekb nm>' ' then
  1596.     {
  1597.     pokeb name+1,peekb 80h-nm+81h
  1598.     moveb name_len from nm to name+2
  1599.     m=searchb name_len from name+2 for 13
  1600.     if m then pokeb m,0
  1601.     if not load_buffer(1) then abort
  1602.     goto entry
  1603.     }
  1604.     nm++
  1605.     }
  1606.  
  1607. if not load_buffer(0) then abort
  1608.  
  1609. entry:
  1610. screen_display
  1611. page_display
  1612. print_name
  1613. must_show
  1614. line_address=-1
  1615.  
  1616. edit:
  1617. set_positions
  1618.  
  1619. wait for keypressed
  1620. ks=keyscan
  1621. k=low ks:s=high ks
  1622.  
  1623. ;Handle keypad cursor movement.
  1624. if ks=18688 then current_address=back_line(current_address,23):goto edit
  1625. if ks=20736 then current_address=forward_line(current_address,23):goto edit
  1626. if peekb 0|417h and 16 then
  1627.     {
  1628.     if ks=18432 then current_address=back_line(current_address,1):goto edit
  1629.     if ks=20480 then current_address=forward_line(current_address,1):goto edit
  1630.     if ks=19200 then current_column-=stab:goto edit
  1631.     if ks=19712 then current_column+=stab:goto edit
  1632.     }
  1633. else
  1634.     {
  1635.     if ks=18432 then ypos--
  1636.     if ks=20480 then ypos++
  1637.     if ks=19200 then xpos--
  1638.     if ks=19712 then xpos++
  1639.     }
  1640. if ks=18176 then home
  1641. if ks=20224 then current_column=0:xpos=end_of_line
  1642. if ks=30464 then ypos=0
  1643. if ks=29952 then ypos=depth-3
  1644. if ks=33792 then top_of_file
  1645. if ks=30208 then
  1646.     {
  1647.     current_address=back_line(end_address,depth-3)
  1648.     ypos=depth-3:home
  1649.     }
  1650. if ks=18231 then xpos=first_nonblank:goto edit
  1651. if ks=29440 then inx:xpos=word_left(xpos)
  1652. if ks=29696 then inx:xpos=word_right(xpos)
  1653.  
  1654. ;Special character movement functions.
  1655. if ks=3840 then xpos=(xpos/stab)*stab-stab
  1656. if ks=3849 then
  1657.     {
  1658.     newx=((xpos+stab)/stab)*stab
  1659.     if insert then
  1660.     {
  1661.     if (newx+current_column)>255 then newx=0
  1662.     while newx>xpos
  1663.         {
  1664.         put_char(' ')
  1665.         }
  1666.     }
  1667.     else xpos=newx
  1668.     goto edit
  1669.     }
  1670. if ks=20992 then insert=not insert
  1671. if ks=21248 then del(current_column+xpos)
  1672. if ks=3592 then back(current_column+xpos):goto edit
  1673. if ks=4608 then clear_line
  1674. if ks=9472 then clear_eol
  1675.  
  1676. ;Line functions.
  1677. if k=13 then
  1678.     {
  1679.     enter_line:
  1680.     enx=first_nonblank
  1681.     if not split_enter then current_column=0:xpos=end_of_line
  1682.     split_line(xpos+current_column,enx)
  1683.     ypos++:xpos=enx:current_column=0
  1684.     goto edit
  1685.     }
  1686. if ks=17408 then
  1687.     {
  1688.     push insert
  1689.     insert=1
  1690.     put_char(' '):xpos--
  1691.     pop insert
  1692.     }
  1693. if ks=5632 then
  1694.     {
  1695.     line_address=-1
  1696.     ma=forward_line(current_address,ypos)
  1697.     get_line(ma)
  1698.     last_ypos=ypos
  1699.     home
  1700.     }
  1701. if (ks=5401) or (ks=3711) then
  1702.     {
  1703.     delete_line
  1704.     goto edit
  1705.     }
  1706. if ks=7936 then
  1707.     {
  1708.     split_line(xpos+current_column,0)
  1709.     ypos++:home
  1710.     }
  1711. if ks=9216 then join_line(xpos+current_column)
  1712. if ks=5120 then
  1713.     {
  1714.     atx=end_of_line+1
  1715.     join_line(atx)
  1716.     repeat 254
  1717.     {
  1718.     if peekb(buffer+atx)<>' ' then goto exit_at
  1719.     del(atx)
  1720.     }
  1721.     exit_at:
  1722.     }
  1723. if ks=16640 then shift_left
  1724. if ks=16896 then shift_right
  1725. if ks=23040 then shift_left:ypos++:must_show
  1726. if ks=23296 then shift_right:ypos++:must_show
  1727. if ks=27648 then
  1728.     {
  1729.     home
  1730.     push insert
  1731.     insert=1
  1732.     if comments
  1733.     then put_char('/'):put_char('*')
  1734.     else put_char(';')
  1735.     repeat 75 put_char('=')
  1736.     if comments then put_char('*'):put_char('/')
  1737.     pop insert
  1738.     split_line(xpos+current_column,0)
  1739.     ypos++:home
  1740.     }
  1741.  
  1742. ;Pop-up menu keys.
  1743. if ks=8448 then word_files
  1744. if ks=8192 then word_default
  1745. if ks=11776 then put_details:compile:goto entry
  1746.  
  1747. ;Special ALT/CTRL-key functions.
  1748. if (ks=12544) and (buffers>1) then
  1749.     {
  1750.     put_details
  1751.     current_buffer++
  1752.     if current_buffer=buffers then current_buffer=0
  1753.     get_details
  1754.     }
  1755. if ks=8704 then
  1756.     {
  1757.     input_message:loctocur
  1758.     print bios "Goto line: ";
  1759.     curtoloc
  1760.     gline=input
  1761.     n=video[locpos]b
  1762.     close window
  1763.     if n>='0' then
  1764.     {
  1765.     top_of_file
  1766.     if gline then gline--
  1767.     current_address=forward_line(current_address,gline)
  1768.     }
  1769.     }
  1770. if ks=5140 then
  1771.     {
  1772.     current_address=forward_line(current_address,ypos)
  1773.     ypos=0:goto edit
  1774.     }
  1775. if ks=12290 then
  1776.     {
  1777.     current_address=back_line(current_address,depth-3-ypos)
  1778.     ypos=depth-3:goto edit
  1779.     }
  1780. if ks=11779 then centre_line:goto edit
  1781. if ks=4613 then
  1782.     {
  1783.     if editm<>65520 then
  1784.     {
  1785.     fseg2=allocate 4096:if error then error 1002:goto edit
  1786.     moveb end_address+1 from fseg|0 to fseg2|0
  1787.     deallocate fseg
  1788.     fseg=fseg2:editm=65520
  1789.     }
  1790.     goto edit
  1791.     }
  1792.  
  1793. ;File option keys.
  1794. if ks=15104 then help_me
  1795. if ks=15360 then put_details:b=select_buffer
  1796. if ks=15616 then save_file(1)
  1797. if ks=15872 then put_details:load_file
  1798. if ks=11520 then put_details:exit_wordq
  1799. if ks=17152 then put_details:print_file:must_show:line_address=-1
  1800. if ks=27136 then
  1801.     {
  1802.     put_details
  1803.     if edit_file then save_file(0)
  1804.     exit_file(0)
  1805.     goto edit
  1806.     }
  1807.  
  1808. ;Find/replace options.
  1809. if ks=16128 then input_find(1)
  1810. if ks=16384 then input_replace(1)
  1811. if ks=22528 then input_find(0)
  1812. if ks=22784 then input_replace(0)
  1813.  
  1814. ;Blocks
  1815. if ks=9728 then
  1816.     {
  1817.     if line_block then reset_block
  1818.     else
  1819.     {
  1820.     put_line
  1821.     reset_block
  1822.     line_block=1
  1823.     origin_blockx=0
  1824.     origin_blocka=line_address
  1825.     }
  1826.     }
  1827. if ks=12288 then
  1828.     {
  1829.     if column_block then reset_block
  1830.     else mark_columns(xpos+current_column)
  1831.     }
  1832. if ks=20011 then
  1833.     {
  1834.     if peekb 0|417h and 3 then n=scrap(0):goto edit
  1835.     }
  1836. if ks=18989 then
  1837.     {
  1838.     if peekb 0|417h and 3 then n=scrap(1):goto edit
  1839.     }
  1840. if ks=4864 then
  1841.     {
  1842.     put_line
  1843.     id=forward_line(line_address,1)
  1844.     if insert_block(line_address,fseg,id,id-line_address) then ypos++
  1845.     }
  1846. if ks=21040 then
  1847.     {
  1848.     put_line
  1849.     input_message:print "Inputting block..."
  1850.     open #1,block_name:if error then goto cs_error
  1851.     seek #1,eof:block_len=reg ax
  1852.     if carry then close #1:goto cs_error
  1853.     c=end_address+block_len:if carry then
  1854.     {
  1855.     error 1013:close #1:close window:goto edit
  1856.     }
  1857.     seek #1,0
  1858.     two=read #1,2 to block_type
  1859.     if (two<>2) or (error<>0) then goto cs_error
  1860.     if not peekb block_type then read_columns:goto readi2
  1861.     ;Read lines.
  1862.     ola=line_address
  1863.     if insert_block(line_address,fseg,0,block_len) then
  1864.     {
  1865.     seek #1,0
  1866.     read_len=read #1,block_len to fseg|ola
  1867.     if read_len<>block_len then goto cs_error
  1868.     }
  1869.     readi2:
  1870.     close #1:close window
  1871.     reset_block:must_show:line_address=-1
  1872.     goto edit
  1873.  
  1874.     cs_error:
  1875.     error 1005
  1876.     close window
  1877.     goto edit
  1878.     }
  1879. if ks=7680 then mark_columns(0)
  1880. if ks=11264 then mark_columns(end_of_line)
  1881. if ks=4352 then
  1882.     {
  1883.     inx:x=word_right(xpos):x=word_left(x):xpos=x:mark_columns(x)
  1884.     while xpos<256
  1885.     {
  1886.     if sept(xpos) then xpos--:goto edit
  1887.     xpos++
  1888.     }
  1889.     }
  1890.  
  1891. if k then if k<>26 then put_char(k)
  1892. goto edit
  1893.  
  1894. ;== WT data ================================================================
  1895.  
  1896. dos_shell:    fname '\command.com'
  1897. block_name:    fname '\wt.ins'
  1898. logfile:    fname 'wt.log'
  1899. config_name:    fname 'wt.cfg'
  1900. bak_extension:    fname '.BAK'
  1901.  
  1902. comp_input:    string 50
  1903. itext:        string 30
  1904. block_name_i:    string 20
  1905.  
  1906. eol_code:    datab 13
  1907. default_ext:    datab 4,0,'F',0,0,0
  1908.  
  1909. exe_com:
  1910. data 0
  1911. data compile_line,0
  1912. data 5ch,0
  1913. data 6ch,0
  1914.  
  1915. comp_menu:
  1916. datab 1,12,13,4,64,8+xcompilers,60h
  1917. datab 22,19,1,'Select compiler.'
  1918. datab 22,1,3,'Modify selected compiler.'
  1919. datab 26
  1920.  
  1921. direct_window:
  1922. datab 0,0,0,10,79,23,10111b,26
  1923.  
  1924. severe:
  1925. datab 0,0,10,11,70,16,4fh
  1926. datab 22,16,4,'Press ESC'
  1927. datab 26
  1928.  
  1929. name:
  1930. data name_len
  1931. space name_len+8
  1932.  
  1933. input_load_name:
  1934. datab 0,0,11,9,69,16,10111b
  1935. datab 22,2,2,'Enter exact file name or use wild cards for directory.'
  1936. datab 26
  1937.  
  1938. save_altered_file:
  1939. datab 0,0,24,10,55,14,1001111b
  1940. datab 22,2,2,'Save changed file? (Y/N)'
  1941. datab 26
  1942.  
  1943. save_errorw:
  1944. datab 0,0,16,7,65,12,1001110b
  1945. datab 22,16,2,'Error saving file!'
  1946. datab 22,2,3,'Press escape to abort, any other key to retry'
  1947. datab 26
  1948.  
  1949. files_menu:
  1950. datab 1,3,30,2,51,8,10111b
  1951. datab 22,6,1,      'Files Menu'
  1952. datab 22,2,3,'Remove file'
  1953. datab 22,2,4,'DOS shell'
  1954. datab 22,2,5,'Exit editor  ALT-X'
  1955. datab 26
  1956.  
  1957. sel_buf:
  1958. datab 1,0,6,3,73,16,1fh
  1959. datab 22,28,1,'Select a File'
  1960. datab 26
  1961.  
  1962. def_input:
  1963. datab 0,0,52,8,75,12,60h
  1964. datab 22,3,2,'New default : '
  1965. datab 26
  1966.  
  1967. tab_input:
  1968. datab 0,0,55,5,74,9,15
  1969. datab 22,2,2,'New tab = '
  1970. datab 26
  1971.  
  1972. default_menu:
  1973. datab 1,0,45,1,70,11,10110b
  1974. datab 22,2,1,'WT Defaults'
  1975. datab 22,2,3,'Extension:'
  1976. datab 22,2,4,'Backups'
  1977. datab 22,2,5,'Line split'
  1978. datab 22,2,6,'Tab step = '
  1979. datab 22,2,7,'Comments'
  1980. datab 22,2,8,'Keeps tabs'
  1981. datab 22,2,9,'Save configuration'
  1982. datab 26
  1983.  
  1984. input_window:
  1985. datab 0,0,8,18,79,22,120
  1986. datab 26
  1987.  
  1988. config_defaults:
  1989. datab 1,4,0,'F',0,0
  1990. datab 0,1,0,0
  1991.  
  1992. findstr: string 30
  1993. replacestr: string 30
  1994. space 1
  1995.  
  1996. wind_files:
  1997. datab 0,0,0,3,40,1,120,26
  1998.  
  1999. logtop:
  2000. datab 'WT text editor log file: By Peter Campbell',13,10,13,10
  2001. datab 'Program                 Date       Time   Notes',13,10
  2002. datab '-------------------------------------------------------------------------------',13,10
  2003. logline:
  2004. datab '                  ??/??/??  ??:??',13,10
  2005.